玩转SQLite

您所在的位置:网站首页 aoc q27p2u q27p1u 玩转SQLite

玩转SQLite

2023-02-22 23:00| 来源: 网络整理| 查看: 265

SQLite是一个跨平台的轻量级数据库,支持C/C++开发,可用于嵌入式中,关于C/C++使用SQLite的简单实例,之前这篇文章,已经介绍过一种简单的使用方式。本篇来介绍另一种更加高效的调用方式。

1.1 普通方式

之前的文章介绍过sqlite3的C语言API函数基础操作,通过 sqlite3_exec函数即可执行sql语句函数,该函数指定一个 sql语句字符串和对应的回调函数。

当执行sqlite3_exec时,其内部的执行可分为3步:

解析sql语句字符串 编译sql语句 执行sql语句

可以看到,sqlite3_exec一个函数就实现了这么多功能,这是它的 优点——使用方便,但同时也是它的 缺点——效率低,因为解析和编译都是比较耗时的。

1.2 高效方式

为此解决sqlite3_exec函数执行效率低的问题,就出现了其它更加高效的解决方式: 将sqlite3_exec的功能进行分解,由多个函数共同完成。这就是本篇要介绍的:

sqlite3_prepare_v2()函数:实现对sql语句(模板)的解析和编译,生成了可以被执行的 sql语句实例 sqlite3_stmt()数据结构:可以理解为一种”准备语句对象”,它可以结合变量使用,进而实现相同操作的循环 sqlite3_bind_*() 函数:用于绑定赋值变量 sqlite3_step() 函数:用于执行sql语句

相比较使用sqlite3_exec函数,现在这种方式,sql语句的解析和编译只执行了一次,而sqlite3_step执行多次,整体的效率势必大大提升。

2.1 sqlite3错误码

在介绍每个函数之前,让我们先来看看其中一个函数的错误代码。

[En]

Before introducing each function, let’s take a look at the error codes of one of these functions.

#define SQLITE_OK 0 #define SQLITE_ERROR 1 #define SQLITE_INTERNAL 2 #define SQLITE_PERM 3 #define SQLITE_ABORT 4 #define SQLITE_BUSY 5 #define SQLITE_LOCKED 6 #define SQLITE_NOMEM 7 #define SQLITE_READONLY 8 #define SQLITE_INTERRUPT 9 #define SQLITE_IOERR 10 #define SQLITE_CORRUPT 11 #define SQLITE_NOTFOUND 12 #define SQLITE_FULL 13 #define SQLITE_CANTOPEN 14 #define SQLITE_PROTOCOL 15 #define SQLITE_EMPTY 16 #define SQLITE_SCHEMA 17 #define SQLITE_TOOBIG 18 #define SQLITE_CONSTRAINT 19 #define SQLITE_MISMATCH 20 #define SQLITE_MISUSE 21 #define SQLITE_NOLFS 22 #define SQLITE_AUTH 23 #define SQLITE_FORMAT 24 #define SQLITE_RANGE 25 #define SQLITE_NOTADB 26 #define SQLITE_NOTICE 27 #define SQLITE_WARNING 28 #define SQLITE_ROW 100 #define SQLITE_DONE 101 2.2 sqlite3_prepare_v2

该函数实现对sql语句(模板)的解析和编译,生成了可以被执行的sql语句实例

int sqlite3_prepare_v2( sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **ppStmt, const char **pzTail );

参数:

db:sqlite数据库 zSql:要执行的sql语句(可以包含未赋值的变量) nByte:sql语句的(字符串的)长度 ppStmt:解析编译出的sql语句实例 pzTail:

返回值:见前面的sqlite3错误码

2.3 sqlite3_bind

该函数组用于 绑定变量值到prepare语句中,也就是给 sqlite3_stmt变量赋值。前面的文章讲过,我们一定是先通过sqlite3_prepare_v2函数创建并初始化一个 sqlite3_stmt 变量语句,然后使用sqlite3_bind_xxx函数对 这个 sql语句变量进行绑定参数。

int sqlite3_bind_int(sqlite3_stmt*, int, int); int sqlite3_bind_doubule(sqlite3_stmt*, int, double); int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int, void(*)(void*));

参数:

形参1:sqlite3_stmt: prepare语句编译出的sql语句实例 形参2: sqlite3_stmt变量参数的序号索引值,规定最左侧的SQL参数的索引值为 1,也就是说参数索引值从1开始。 形参3: 是要绑定给第2个形参指向的 变量参数的 实际值。第2个形参可以指向不同的索引值。 形参4: 对于有4个形参的函数,第4个形参一般是第3个形参的长度。 形参5: 是用于BLOB和字符串绑定后的 析构函数,用于在sqlite处理完blob或字符串之后处理它,一般可以设置为NULL。

返回值:见前面的sqlite3错误码

代码示例:假设表的字段结构为:person(name,age,sex),数据库指针为 pdb。

sqlite3_stmt *pstmt; const char *sql = "INSERT INTO person(name, age, sex) VALUES(?,?,?);"; nRet = sqlite3_prepare_v2(pdb, sql, strlen(sql), &pstmt, &pzTail); int i; for(i = 0; i < 10; i++){ nCol = 1; sqlite3_bind_text(pstmt, nCol++, a[i].name, strlen(a[i].name), NULL); sqlite3_bind_int(pstmt, nCol++, a[i].age); sqlite3_bind_text(pstmt, nCol++, a[i].sex, strlen(a[i].name), NULL); sqlite3_step(pstmt); sqlite3_reset(pstmt); } sqlite3_finalize(pstmt); 2.4 sqlite3_step int sqlite3_step(sqlite3_stmt *pStmt);

参数:

pStmt:prepare语句编译出的sql语句实例

返回值:

以下是几个更常见的返回值:

[En]

Here are a few more common return values:

SQLITE_DONE:意味着 sql语句执行完成且成功。一旦执行成功后,sqlite3_step()就不应该被再次调用执行,除非我们使用sqlite3_reset()重置 sqlite3_stmt 数据。

SQLITE_ROW:这个比较常用,当我们的sql语句是 读命令, 比如”SELECT FROM…”,返回的数据一般很多,并且数据是按行返回的,且每次只返回一行*,其返回值为 SQLITE_ROW,所以需要重复调用sqlite3_step函数,直到sqlite3_step返回 SQLITE_DONE.

SQLITE_MISUSE: 表示该函数实例被滥用,不合适,比如sqlite_stmt结构已经被销毁了。

2.5 sqlite3_reset int sqlite3_reset(sqlite3_stmt *pStmt);

用于重置一个准备语句对象到它的初始状态,然后准备被重新执行。所有sql语句变量使用sqlite3_bind*绑定值,使用sqlite3_clear_bindings重设这些绑定。Sqlite3_reset接口重置准备语句到它代码开始的时候。sqlite3_reset并不改变在准备语句上的任何绑定值,那么这里猜测,可能是语句在被执行的过程中发生了其他的改变,然后这个语句将它重置到绑定值的时候的那个状态。

2.6 sqlite3_column

该函数实例用于 查询(query)结果的筛选,返回当前结果的某1列。

int sqlite3_column_int(sqlite3_stmt*, int iCol); double sqlite3_column_double(sqlite3_stmt*, int iCol); const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);

参数:

sqlite3_stmt*:prepare语句编译出的sql语句实例 iCol: 要查询的”列”索引值。sqlite3规定最左侧的”列”索引值是 0,也就是”列”索引号从 0 开始。

返回:

根据函数类型,返回相应的数据,比如int型,double型(浮点数也是),text(字符串型)等。

本篇主要介绍了sqlite的C语言操作的高效API函数,用于取代功能强大但效率较低的 sqlite3_exec函数。本篇介绍到的几个API函数总结如下:

sqlite3_prepare_v2() 创建sqlite3_stmt对象 sqlite3_bind_*() 绑定参数值到sqlite3_stmt sqlite3_step() 运行sql语句,可以是一次,也可以是循环执行 sqlite3_reset() 重置sqlite3_stmt对象 sqlite3_finalize() 销毁sqlite3_stmt对象

在第二部分中,我们将通过一个实际例子来体验这些功能的具体效果。

[En]

In the second part, we will experience the specific effects of these functions through a practical example.

Original: https://blog.csdn.net/hbsyaaa/article/details/127858034Author: 码农爱学习Title: 玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数

相关阅读 Title: hive安装 ———附下载链接、安装过程中所遇问题及解决办法(linux)

目录

一、前期准备

1. hive 及相关配置文件下载

1. hadoop集群

2. 安装mysql

二、安装hive

1. 解压并安装 Hive 使用下面的命令,解压 Hive 安装包:

2. 配置 MySQL

3 .配置 Hive

5.启动 Hive

6. 配置hive下的mysql数据库

7. 验证 Hive 安装是否成功

三、遇到问题及解决

在启动hive时出现如下问题:

原因:

解决过程:

一、前期准备

信息版本存放位置用户主机名hadoop集群hadoop3.3/home/hadoop/software/hadoopHadoopMastermysqlmysql5.7/homerootHadoopMasterhivehive3.1.2/home/hadoop/software/hadoopHadoopMaster

注:

在安装过程中如果有要写HadoopMster的地方,请换成自己的主机名 在有/home/hadoop/software/路径时,请对应换成自己相应存放hive的路径 配置hive是在hadoop集群的master主机下配置的 1. hive 及相关配置文件下载

http://链接:https://pan.baidu.com/s/1YdQ-93Rpls7rM_i375K85w?pwd=ukdz

玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数

注:这三个都要下载 ,之后配置会用到

1. hadoop集群

该部分的安装需要在Hadoop 已经成功安装的基础上,并且要求

Hadoop 已经正常启动。

如果hadoop集群没有部署好的可以参看这篇文章:https://editor.csdn.net/md/?articleId=127031634

2. 安装mysql

如果mysql没有安装好的可以参考这篇文章:https://mp.csdn.net/mp_blog/creation/editor/127597908

二、安装hive

1. 解压并安装 Hive 使用下面的命令,解压 Hive 安装包: cd /home/hadoop/software/ tar -zxvf apache-hive-3.1.2-bin.tar.gz

玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数 mv apache-hive-3.1.2-bin hive3.1.2 #重命名

玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数 cd hive3.1.2

执行一下ls -l 命令会看到下面的图片所示内容,这些内容是 Hive 包含的文件:

玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数 2 . 配置 MySQL mysql -u root -p #然后创建 myhive 用户: grant all on *.* to myhive@'%' identified by '123456'; grant all on *.* to myhive@'localhost' identified by '123456'; grant all on *.* to myhive@'HadoopMaster' identified by '123456'; flush privileges; #刷新 注意:这里的HadoopMaster要对于改为自己hadoop集群中master节点的主机名 创建数据库: create database hive01;

玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数

玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数 3 . 配置 Hive

(1)进入hive 安装目录下的配置目录,然后修改配置文件:

注:如果主机名和我的不一样的要把配置文件中的HadoopMaster 对应换成自己的主机名

cd /home/hadoop/software/hive3.1.2/conf 在windows上先打开一个txt文件,然后在文件中添加如下内容 hive.metastore.local true javax.jdo.option.ConnectionURL jdbc:mysql://HadoopMaster:3306/hive01?characterEncoding=UTF-8 javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver javax.jdo.option.ConnectionUserName myhive javax.jdo.option.ConnectionPassword 123456

然后将文件另存为 hive-site.xml 文件,注意这里的后缀是xml

玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数

写好之后,将hive-site.xml 文件上传到/home/hadoop/software/hive3.1.2/conf

目录下,上传好之后ll即可看到。

玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数

(2)将 mysql 的java connector 复制到依赖库中

ps -ef | grep mysql #查看mysql是否启动,如下所示即为启动玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数 如果没有启动的则先启动mysql ( /home/mysql5.7/support-files/mysql.server start) mysql -u root -p #登录mysql用户玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数

(3)将文件 mysql-connector-java.jar 上传到hive的lib目录下

玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数

(4) 使用下面的命令打开配置:

vi /home/hadoop/.bash_profile #在文件中添加如下内容 export HIVE_HOME=/home/hadoop/software/hive3.1.2 export PATH=$HIVE_HOME/bin:$PATH #这里的/home/hadoop/software/hive3.1.2 是自己存放hive的路径

玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数 添加好之后保存退出,输入:source ~/.bash_pofile 5. 启动 Hive

输入:hive

玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数

提醒:如果这里启动hive的时候出现错误,请直接跳到后面遇到问题及解决办法

注:到了这里hive的下的mysql数据库还不能正常使用,要先初始化hive下的mysql数据库

6. 配置hive下的mysql数据库 /home/hadoop/software/hive3.1.2/bin schematool -dbType mysql --initSchema #初始化mysql数据库

玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数

初始化之后等待完成,出现 schemaTool completed就可以了。

玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数 7. 验证 Hive 安装是否成功 hive show databases;

玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数

三、遇到问题及解决

在启动hive时出现如下问题:

Exception in thread “main” java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V

at org.apache.hadoop.conf.Configuration.set(Configuration.java:1380)

at org.apache.hadoop.conf.Configuration.set(Configuration.java:1361)

at org.apache.hadoop.mapred.JobConf.setJar(JobConf.java:536)

at org.apache.hadoop.mapred.JobConf.setJarByClass(JobConf.java:554)

at org.apache.hadoop.mapred.JobConf.

at org.apache.hadoop.hive.conf.HiveConf.initialize(HiveConf.java:5141)

at org.apache.hadoop.hive.conf.HiveConf.

at org.apache.hadoop.hive.common.LogUtils.initHiveLog4jCommon(LogUtils.java:97)

at org.apache.hadoop.hive.common.LogUtils.initHiveLog4j(LogUtils.java:81)

at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:699)

at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:683)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.apache.hadoop.util.RunJar.run(RunJar.java:323)

at org.apache.hadoop.util.RunJar.main(RunJar.java:236)

原因:

这是因为hadoop下的java剖出来的异常,因为版本不一样

玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数 解决过程: 进入 hadoop的/hadoop-3.3.0/share/hadoop/common/lib 路径下

ll | grep guav 筛选查询以guva 开头的jar包

玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数

进入 hive3.1.2/lib 路径下

ll | grep guav 筛选查询以guva 开头的jar包

玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数

可以看到在hadoop下的guava-27.0-jre.jar包是27版本的,而在hive下的 guava-19.0.jar 是19版本

玩转SQLite-11:C语言高效API之sqlite3_prepare系列函数 将hive 下的包删除guava-19.0.jar 进入到hadoop的路径下 cp guava-27.0-jre.jar /home/hadoop/software//hive3.1.2/lib/ #将guava-27.0-jre.jar复制到hive的lib目录下 从新启动hive就可以了

Original: https://blog.csdn.net/m0_61232019/article/details/127656281Author: 冷-风-吹Title: hive安装 ———附下载链接、安装过程中所遇问题及解决办法(linux)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/405138/

转载文章受原作者版权保护。转载请注明原作者出处!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3